Перейти к основному содержимому

2.10. Modbus

Всем

Modbus

Протокол Modbus — это один из самых ранних и наиболее распространённых способов организации цифрового взаимодействия между промышленными устройствами. Он возник в эпоху, когда автоматизация только начинала выходить за пределы механических реле и аналоговых систем управления. Его появление стало ответом на практическую потребность: дать возможность контроллерам, датчикам, исполнительным механизмам и другим компонентам промышленной инфраструктуры обмениваться информацией в понятном, стандартизированном формате.

Modbus не был задуман как универсальная платформа или сложная система с многоуровневой архитектурой. Это простой, надёжный и минималистичный протокол, созданный для решения конкретной задачи — чтения состояний и записи команд в устройства, подключённые к единой шине. Именно эта простота стала ключевым фактором его долголетия. Более сорока лет спустя после своего появления Modbus остаётся стандартом де-факто в промышленной автоматизации, энергетике, системах мониторинга и управления зданиями.

Историческое происхождение: от Modicon к открытому миру

Протокол Modbus был разработан в 1979 году компанией Modicon, которая в то время была одним из пионеров в области программируемых логических контроллеров (ПЛК). Целью было обеспечить связь между ПЛК Modicon и периферийными устройствами через последовательный интерфейс RS-232 — стандартную технологию передачи данных того времени.

Особое значение имело решение компании Modicon сделать спецификацию протокола открытой. В отличие от многих конкурентов, которые использовали проприетарные протоколы, закрытые от сторонних производителей, Modicon опубликовала документацию и позволила любому желающему реализовать поддержку Modbus в своём оборудовании. Это решение породило экосистему совместимых устройств, где оборудование от разных производителей могло работать в одной системе без необходимости дорогостоящих адаптеров или шлюзов.

Со временем права на протокол были переданы некоммерческой организации Modbus Organization, которая и по сей день занимается поддержкой и развитием стандарта. Открытость, простота реализации и широкая поддержка со стороны производителей сделали Modbus фактическим языком промышленного интернета вещей задолго до появления самого термина «IoT».

Архитектурная модель: ведущий и ведомые

Основа логики Modbus — строгая иерархическая модель взаимодействия, известная как ведущий–ведомый (master–slave). В более современной терминологии, особенно применительно к Modbus TCP, используются термины клиент–сервер, но суть остаётся прежней: инициатива обмена всегда исходит от одного участника, а остальные реагируют на запросы.

Ведущее устройство (мастер или клиент) — это центральный узел, который управляет потоком данных. Чаще всего это промышленный контроллер, SCADA-система, ПЛК или компьютер с программным обеспечением для мониторинга. Мастер формирует запросы, указывает адрес получателя, тип операции и данные, если требуется запись.

Ведомые устройства (слейвы или серверы) — это периферийные компоненты: датчики температуры, счётчики импульсов, реле, частотные преобразователи, модули ввода-вывода. Каждое ведомое устройство имеет уникальный числовой адрес в пределах сети — от 1 до 247. Устройства постоянно «слушают» шину и реагируют только на те запросы, в которых указан их собственный адрес. Они не могут инициировать передачу данных самостоятельно; их роль — выполнить команду и отправить ответ.

Эта архитектура гарантирует предсказуемость поведения сети. Коллизии при передаче данных исключены, поскольку только одно устройство может говорить в каждый момент времени. Такой подход идеально подходит для систем, где важна стабильность и детерминированность, а не высокая скорость или двунаправленная инициатива.

Физические среды передачи: от проводов к Ethernet

Modbus изначально проектировался для работы по последовательным линиям связи. Со временем появились несколько реализаций, каждая из которых использует свою физическую среду:

  • Modbus RTU (Remote Terminal Unit) — самая распространённая версия для последовательных интерфейсов. Она использует двоичное кодирование данных и работает преимущественно по RS-485, реже — по RS-232 или RS-422. Интерфейс RS-485 позволяет подключать до 32 (а с повторителями — до 247) устройств к одной шине и обеспечивает передачу данных на расстояния до 1200 метров при скорости до 115200 бод. Разделение пакетов осуществляется по временным интервалам: пауза между байтами должна быть меньше минимального межпакетного интервала, иначе сообщение считается завершённым.

  • Modbus ASCII — альтернативная реализация для тех же последовательных линий. Здесь каждый байт данных представляется двумя символами в шестнадцатеричной системе счисления, закодированными в ASCII. Сообщение начинается с символа двоеточия : и завершается символами возврата каретки и перевода строки \r\n. Такой формат менее эффективен по объёму передаваемых данных, но проще для визуального анализа и отладки, особенно при работе с терминалами или логгерами.

  • Modbus TCP — адаптация протокола для сетей на основе Ethernet и TCP/IP. Здесь данные упаковываются в стандартные TCP-пакеты и передаются по IP-сети. Физический уровень — обычный Ethernet-кабель, Wi-Fi или любая другая IP-совместимая инфраструктура. Modbus TCP сохраняет логическую структуру запросов и ответов, но добавляет заголовок MBAP (Modbus Application Protocol), содержащий идентификатор транзакции, длину данных и адрес устройства. Проверка целостности данных возлагается на сам TCP, поэтому контрольные суммы, обязательные в RTU и ASCII, здесь не используются.

Выбор реализации зависит от требований проекта: расстояние, количество устройств, доступная инфраструктура, необходимость интеграции с IT-сетями и удобство диагностики.

Структура сообщения: ADU и PDU

Независимо от физической среды, каждое сообщение Modbus состоит из двух логических частей:

  • PDU (Protocol Data Unit) — это ядро сообщения, одинаковое для всех реализаций. Оно содержит код функции и данные. Код функции указывает тип операции: чтение дискретных входов, запись катушек, чтение регистров хранения и так далее. Данные зависят от операции: это может быть адрес регистра, количество запрашиваемых элементов или значения для записи.

  • ADU (Application Data Unit) — полный пакет, передаваемый по сети. Он включает в себя PDU, дополненный элементами, специфичными для выбранной реализации. Например, в Modbus RTU ADU состоит из адреса устройства, PDU и 16-битной контрольной суммы CRC. В Modbus TCP ADU содержит MBAP-заголовок, за которым следует PDU.

Такая модульность позволяет разработчикам сосредоточиться на логике приложения, не углубляясь в детали физического уровня. Программная реализация может абстрагировать различия между RTU и TCP, предоставляя единый интерфейс для работы с данными.

Типы данных и адресное пространство

Modbus оперирует четырьмя основными типами данных, каждый из которых имеет своё назначение и набор функций:

  1. Discrete Inputs — дискретные входы. Это однобитовые значения, отражающие состояние внешних сигналов: включён ли датчик, нажата ли кнопка, открыт ли контакт. Они доступны только для чтения. Адреса этих значений условно начинаются с 10001 (хотя в самом протоколе используется нумерация с нуля).

  2. Coils — катушки. Это внутренние или выходные дискретные значения, которыми можно управлять. Например, команда на включение реле или установка флага в логике контроллера. Катушки поддерживают как чтение, так и запись. Их адреса начинаются с 20001.

  3. Input Registers — входные регистры. Это 16-битные значения, обычно представляющие показания аналоговых датчиков: температуру, давление, напряжение. Они доступны только для чтения. Адреса начинаются с 30001.

  4. Holding Registers — регистры хранения. Это 16-битные ячейки памяти, которые можно читать и записывать. Они используются для передачи параметров, настроек, команд или результатов вычислений. Адреса начинаются с 40001.

Важно понимать, что эти «входы» и «выходы» — это не обязательно физические контакты. Часто они представляют собой внутренние переменные контроллера или виртуальные точки данных, организованные для удобства взаимодействия. Производители оборудования сами определяют, какие регистры использовать и как их интерпретировать. Поэтому ключевым документом при работе с любым устройством является его Modbus-карта, где указано соответствие между адресами и физическим смыслом данных.


Функции протокола: язык запросов и ответов

В основе каждого обмена данными по Modbus лежит функция — однобайтовый код, определяющий тип операции. Функции разделены по категориям данных и направлению действия (чтение или запись). Все функции стандартизированы, и большинство устройств реализуют только базовый набор, достаточный для повседневных задач автоматизации.

Чтение дискретных входов — функция 02

Эта функция позволяет мастеру получить состояние внешних дискретных сигналов: например, открыт ли датчик двери, сработал ли концевой выключатель. Устройство возвращает последовательность битов, каждый из которых соответствует одному входу. Бит со значением 1 означает активное состояние, 0 — неактивное.

Чтение катушек — функция 01

Катушки — это внутренние или выходные дискретные точки устройства. Они могут управлять реле, светодиодами или флагами в программной логике. Функция 01 читает текущее состояние этих точек. Это особенно полезно при диагностике или синхронизации состояний между несколькими системами.

Запись одной катушки — функция 05

Мастер может отправить команду на установку или сброс одного бита в области катушек. Например, включить насос или отключить сигнализацию. Ответ устройства подтверждает успешное выполнение операции.

Запись нескольких катушек — функция 15

Когда требуется изменить сразу несколько дискретных выходов, используется групповая запись. Это эффективнее, чем отправлять множество отдельных команд. Протокол позволяет записать до 1968 катушек за один запрос.

Чтение входных регистров — функция 04

Входные регистры содержат 16-битные значения, обычно полученные с аналоговых датчиков: температура, давление, уровень жидкости, напряжение. Эти данные доступны только для чтения. Функция 04 запрашивает блок регистров, и устройство возвращает их содержимое в виде массива 16-битных слов.

Чтение регистров хранения — функция 03

Регистры хранения — универсальное хранилище для параметров, настроек, результатов вычислений или команд. Они поддерживают как чтение, так и запись. Функция 03 позволяет считать произвольный диапазон таких регистров.

Запись одного регистра хранения — функция 06

Используется для изменения одного 16-битного значения: например, установка уставки температуры или скорости двигателя.

Запись нескольких регистров хранения — функция 16

Групповая запись регистров применяется при передаче сложных структур данных: времени, координат, массивов настроек. Это основной способ передачи конфигурации от SCADA-системы к контроллеру.

Каждая функция строго определяет формат запроса и ответа. Если устройство не поддерживает запрошенную функцию или адрес выходит за пределы допустимого диапазона, оно возвращает ошибку, добавляя 128 к коду функции и указывая код исключения (например, «недопустимый адрес» или «устройство занято»).


Практический пример: чтение данных с промышленного коммутатора

Рассмотрим реальный сценарий: необходимо получить количество переданных пакетов на первом порту промышленного Ethernet-коммутатора Advantech EKI-5524SSI через Modbus TCP.

Согласно документации производителя, эта информация хранится в четырёх последовательных регистрах хранения, начиная с адреса 38193. Значение представлено в виде 64-битного целого числа, разбитого на четыре 16-битных слова в порядке little-endian (младшее слово первым).

Мастер (например, сервер мониторинга) отправляет запрос:

  • IP-адрес устройства: 192.168.0.17
  • Код функции: 04 (чтение входных регистров)
  • Начальный адрес: 38193
  • Количество регистров: 4

Устройство отвечает четырьмя 16-битными значениями. Допустим, получен ответ:
[0x0000, 0x0000, 0x0000, 0x3459].

После сборки в 64-битное число и перевода в десятичную систему получаем 13401 — именно столько пакетов прошло через порт с момента последней перезагрузки. Такой подход позволяет точно отслеживать нагрузку на сеть, выявлять аномалии или планировать техническое обслуживание.


Ограничения и уязвимости протокола

Несмотря на широкое распространение, Modbus имеет ряд врождённых ограничений, обусловленных эпохой его создания:

Отсутствие механизмов безопасности. Протокол не содержит средств аутентификации, авторизации или шифрования. Любой, кто получает доступ к шине RS-485 или IP-сети, может читать и изменять данные. В современных условиях это требует обязательного использования дополнительных мер защиты: изоляции сетей, VPN-туннелей, фаерволов или шлюзов с фильтрацией трафика.

Пассивность ведомых устройств. Ведомые устройства не могут инициировать передачу данных. Это означает, что мастер должен постоянно опрашивать все узлы, даже если данные меняются редко. Такой подход создаёт избыточный трафик и задержки при реакции на события. Некоторые производители реализуют расширения (например, «изменение по событию»), но они не являются частью стандарта.

Отсутствие подтверждения доставки в широковещательных запросах. Адрес 0 используется для отправки команд всем устройствам одновременно (например, «сброс всех реле»). Однако ведомые не отвечают на такие запросы, поэтому мастер не может узнать, были ли команды выполнены.

Ограниченная адресация. В последовательных сетях Modbus RTU/ASCII допускается максимум 247 уникальных адресов. Это достаточно для большинства локальных систем, но недостаточно для крупных распределённых объектов. Решение — использование шлюзов или переход на Modbus TCP, где адресация осуществляется на уровне IP.

Отсутствие типизации данных. Все данные передаются как сырые байты. Протокол не знает, является ли значение температурой в градусах Цельсия, временем в миллисекундах или строкой. Интерпретация полностью лежит на стороне приложения. Это требует строгого соблюдения документации и согласования форматов между разработчиками.


Интеграция и оборудование: как Modbus живёт в реальном мире

Modbus поддерживается тысячами устройств: от простых датчиков до сложных контроллеров. Производители часто предоставляют Modbus-карту, в которой указано, какие регистры соответствуют каким физическим или логическим величинам.

Для соединения устройств с разными интерфейсами используются шлюзы. Например, модуль Advantech EKI-1200 преобразует Modbus RTU (по RS-485) в Modbus TCP (по Ethernet). Это позволяет подключить старые датчики к современной SCADA-системе без замены оборудования.

Модули удалённого ввода-вывода, такие как ADAM-6000 или WISE-4000, сами выступают в роли ведомых устройств. Они собирают данные с датчиков и предоставляют их по Modbus TCP любому клиенту в сети — будь то ПЛК, сервер или веб-приложение.

Контроллеры, например APAX-5000, могут работать как в режиме мастера (опрашивая периферию), так и в режиме сервера (предоставляя свои данные другим системам). Это делает их универсальными узлами в гибридных архитектурах.


Примеры применения в отраслях

Сельское хозяйство. В системе мониторинга теплиц модули ADAM-6000 собирают данные о температуре, влажности и освещённости. На основе этих данных автоматически управляются форточки, увлажнители и освещение. Все параметры доступны через веб-интерфейс WebAccess, построенный поверх Modbus TCP.

Энергетика. В солнечной системе нагрева воды датчики температуры и расхода подключены по RS-485 к центральному контроллеру. Данные передаются в SCADA-систему, которая строит графики, генерирует аварийные сигналы и сохраняет историю для анализа эффективности.

Промышленность. На производственной линии ПЛК опрашивает частотные преобразователи, счётчики и клапаны через Modbus RTU. Одновременно он предоставляет агрегированные данные по Modbus TCP серверу мониторинга, который отображает состояние линии в реальном времени.